
// 字符串与切片
fn main() {
    // test01();

    // test02();
}

#[test]
// 切片 允许你引用集合中部分连续的元素序列，而不是引用整个集合
// 对于字符串而言，切片就是对 String 类型中某一部分的引用
fn test01() {
    let s = String::from("hello world");

    let hello = &s[0..5];
    let world = &s[6..11];
    println!("{}, {}", hello, world);

    // 从 0 索引开始，两个方法等价
    let slice = &s[0..2];
    let slice = &s[..2];

    // 到末尾索引截至，两个方法等价
    let len = s.len();
    let slice = &s[4..len];
    let slice = &s[4..];

    // 截取全部字符串，两个方法等价
    let slice = &s[0..len];
    let slice = &s[..];
}

#[test]
// 字符串的切片类型标识为：&str
fn test02() {
    let mut s = String::from("hello world");

    let word = first_word(&s);

    // let word2 = first_word2(&mut s);

    // 放开这行会报错，因为 clear() 内部会调用字符串的可变借用，而在下面会调用不可变借用，因此报错
    // 改为 first_word2 方法即可
    // s.clear(); // error!

    println!("the first word is: {}", word);
}

fn first_word(s: &String) -> &str {
    &s[..1]
}


fn first_word2(s: &mut String) -> &mut str {
    &mut s[..1]
}
